<?php
/**
 * Created by PhpStorm.
 * User: liang.gao
 * Date: 2017/11/17
 * Time: 16:06
 */

require_once LIBRARY_PATH .'/smartylib/Smarty.class.php';
class Maoshen_View_Smarty implements Zend_View_Interface {
    /**
     * Smarty object
     *
     * @var Smarty
     */
    protected $_smarty;
    /**
     * Constructor
     *
     * @param $tmplPath string
     * @param $extraParams array
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array()) {
        $this->_smarty = new Smarty ();
        if (null !== $tmplPath) {
            $this->setScriptPath ( $tmplPath );
        }
        foreach ( $extraParams as $key => $value ) {
            $this->_smarty->$key = $value;
        }
    }
    /**
     * Return the template engine object
     *
     * @return Smarty
     */
    public function getEngine() {
        return $this->_smarty;
    }
    /**
     * Set the path to the templates
     *
     * @param $path string
     *      The directory to set as the path.
     * @return void
     */
    public function setScriptPath($path) {
        if (is_readable ( $path )) {
            $this->_smarty->template_dir = $path;
            return;
        }
        throw new Exception ( 'Invalid path provided' );
    }
    /**
     * Retrieve the current template directory
     *
     * @return string
     */
    public function getScriptPaths() {
        return array ($this->_smarty->template_dir );
    }
    /**
     * Alias for setScriptPath
     *
     * @param $path string
     * @param $prefix string
     *      Unused
     * @return void
     */
    public function setBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath ( $path );
    }
    /**
     * Alias for setScriptPath
     *
     * @param $path string
     * @param $prefix string
     *      Unused
     * @return void
     */
    public function addBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath ( $path );
    }
    /**
     * Assign a variable to the template
     *
     * @param $key string
     *      The variable name.
     * @param $val mixed
     *      The variable value.
     * @return void
     */
    public function __set($key, $val) {
        $this->_smarty->assign ( $key, $val );
    }
    /**
     * Retrieve an assigned variable
     *
     * @param $key string
     *      The variable name.
     * @return mixed The variable value.
     */
    public function __get($key) {
        return $this->_smarty->get_template_vars ( $key );
    }
    /**
     * Allows testing with empty() and isset() to work
     *
     * @param $key string
     * @return boolean
     */
    public function __isset($key) {
        return (null !== $this->_smarty->get_template_vars ( $key ));
    }
    /**
     * Allows unset() on object properties to work
     *
     * @param $key string
     * @return void
     */
    public function __unset($key) {
        $this->_smarty->clear_assign ( $key );
    }
    /**
     * Assign variables to the template
     *
     * Allows setting a specific key to the specified value, OR passing an array
     * of key => value pairs to set en masse.
     *
     * @see __set()
     * @param $spec string|array
     *      The assignment strategy to use (key or array of key
     *      => value pairs)
     * @param $value mixed
     *      (Optional) If assigning a named variable, use this
     *      as the value.
     * @return void
     */
    public function assign($spec, $value = null) {
        if (is_array ( $spec )) {
            $this->_smarty->assign ( $spec );
            return;
        }
        $this->_smarty->assign ( $spec, $value );
    }
    /**
     * Clear all assigned variables
     *
     * Clears all variables assigned to Zend_View either via {@link assign()} or
     * property overloading ({@link __get()}/{@link __set()}).
     *
     * @return void
     */
    public function clearVars() {
        $this->_smarty->clear_all_assign ();
    }
    /**
     * Processes a template and returns the output.
     *
     * @param $name string
     *      The template to process.
     * @return string The output.
     */
    public function render($name) {
        ob_start();
        echo $this->_smarty->fetch ( $name );
        unset($name);
    }
}